home *** CD-ROM | disk | FTP | other *** search
/ Ham Radio 2000 #1 / Ham Radio 2000.iso / ham2000 / bbs / dirm_ed / ghs.c < prev    next >
Encoding:
C/C++ Source or Header  |  1992-08-12  |  10.7 KB  |  360 lines

  1.  
  2. /*  ┌─────────────────────┐
  3.  *  │  EDITOR DIRMES.SYS  │
  4.  *  └─────────────────────┘
  5.  */
  6.  
  7. // INCLUDEs
  8.  
  9. #include <windows.h>
  10. #include "ghs.h"
  11. #include "struct.h"
  12.  
  13. // PROTOTIPOS
  14.  
  15. long FAR PASCAL WndProc             ( HWND , WORD , WORD , LONG );
  16. BOOL FAR PASCAL EditarMsg           ( HWND , WORD , WORD , LONG );
  17. BOOL FAR PASCAL OpcionSalida        ( HWND , WORD , WORD , LONG );
  18. void            PasaListAMemoria    ( HWND );
  19. void            GestErr             ( HWND , int );
  20. void            VisualizarListado   ( int, int );
  21. void            PasarListADisco     ( HWND );
  22.  
  23. // DEFINEs
  24.  
  25. #define MAXNUMMSG 5000
  26. //#define DEBUG
  27. #define LEP       22                // lineas en pantalla
  28.  
  29. // VARIABLES GROBALES
  30.  
  31. HANDLE       hInst;
  32. char         szAppName[]="Editor DIRMES.SYS v1.0 (920812)";
  33. HANDLE       hElemLista[MAXNUMMSG];
  34. int          nNumMsg=0;
  35. HWND         hListBox;
  36. HWND         hScrollBar;
  37. char         tipe[]="ABPT", status[]="$AFKNY";
  38.  
  39. int PASCAL WinMain(HANDLE hInstance, HANDLE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
  40. {
  41.     HWND hwnd;
  42.     MSG msg;
  43.     WNDCLASS wc;
  44.     int n;
  45.  
  46.    if (!hPrevInstance)
  47.         {
  48.         wc.style         = CS_HREDRAW | CS_VREDRAW;
  49.         wc.lpfnWndProc   = WndProc;
  50.         wc.cbClsExtra    = 0;
  51.         wc.cbWndExtra    = 0;
  52.         wc.hInstance     = hInstance;
  53.         wc.hIcon         = LoadIcon(NULL, IDI_APPLICATION);
  54.         wc.hCursor       = LoadCursor(NULL, IDC_ARROW);
  55.         wc.hbrBackground = COLOR_WINDOW+1;
  56.         wc.lpszMenuName  = "Menu";
  57.         wc.lpszClassName = szAppName;
  58.         RegisterClass(&wc);
  59.         }
  60.  
  61.      hwnd = CreateWindow
  62.           (szAppName,szAppName,WS_MAXIMIZE|WS_OVERLAPPED|WS_CAPTION|WS_SYSMENU|WS_MINIMIZEBOX|WS_VSCROLL,
  63.           CW_USEDEFAULT,CW_USEDEFAULT,630,400,NULL,NULL,hInstance,NULL);
  64.  
  65.  
  66.    ShowWindow (hwnd, nCmdShow) ;
  67.    UpdateWindow (hwnd);
  68.    hInst=hInstance;
  69.    hScrollBar=hwnd;
  70.  
  71.    while(GetMessage(&msg,NULL,0,0))
  72.        {
  73.        TranslateMessage(&msg);
  74.        DispatchMessage(&msg);
  75.        }
  76.    return msg.wParam;
  77. }
  78.  
  79. /* WndProc
  80.  * -------
  81.  * Funcion principal, aqui se redirigen todos los mensajes que se generan
  82.  * en la pantalla principal.
  83.  */
  84. long FAR PASCAL WndProc(HWND hwnd,WORD message,WORD wParam,LONG lParam)
  85. {
  86.  
  87. TEXTMETRIC  tm;
  88. HDC         hdc;
  89. char        szCosa[100],szCosaDos[200];
  90. bullist FAR *lplm;
  91. RECT        rect;
  92. static int  rosa,nOffset=0;
  93. int         f,y;
  94. BOOL        bFlagListBox=FALSE;
  95.  
  96.  
  97. switch (message)
  98.     {
  99.     case WM_CREATE :
  100.         // inicializamos ARRAY de handles
  101.         for (y=0;y!=MAXNUMMSG;y++)hElemLista[y]=NULL;
  102.         hdc=GetDC(hwnd);
  103.         SelectObject(hdc,GetStockObject(SYSTEM_FIXED_FONT));
  104.         GetTextMetrics(hdc,&tm);
  105.  
  106.         GetClientRect( hwnd, &rect);
  107.         
  108.          // creamos dinamicamente una LISTBOX
  109.          hListBox=CreateWindow("listbox",NULL,WS_CHILDWINDOW|WS_VISIBLE,
  110.                                 0,0,rect.right,rect.bottom,hwnd,1,
  111.                                 GetWindowWord(hwnd,GWW_HINSTANCE),NULL);
  112.  
  113.          PasaListAMemoria(hwnd);
  114.          wsprintf(szCosa,"%d mensajes en su DIRMES.SYS !\nSi te gusta el PRG, enviame un MSG/QSL",nNumMsg);
  115.          MessageBox(GetFocus(),szCosa," ",MB_OK);
  116.          SetScrollRange(hScrollBar,SB_VERT,0,nNumMsg,FALSE);
  117.          VisualizarListado(0,LEP);
  118.          break;
  119.  
  120.     case WM_DESTROY :
  121.          DialogBox(hInst, "Salir", hwnd, MakeProcInstance (OpcionSalida ,hInst));
  122.          return 0 ;
  123.  
  124.     case WM_VSCROLL :
  125.          switch ( wParam )
  126.             {
  127.             case SB_PAGEDOWN:
  128.                  // desplaza hacia abajo 5*n entradas
  129.                  nOffset+=10;
  130.                  bFlagListBox=TRUE;
  131.                  break;
  132.             case SB_LINEDOWN:
  133.                  // desplaza hacia abajo n entradas
  134.                  nOffset++;
  135.                  bFlagListBox=TRUE;
  136.                  break;
  137.             case SB_PAGEUP:
  138.                  nOffset-=10;
  139.                  bFlagListBox=TRUE;
  140.                  break;
  141.             case SB_LINEUP:
  142.                  nOffset--;
  143.                  bFlagListBox=TRUE;
  144.                  break;
  145.             }
  146.          if (!bFlagListBox)break;
  147.          bFlagListBox=FALSE;
  148.          if (nOffset<0)nOffset=0;
  149.          if ( (nOffset*LEP)>nNumMsg ) nOffset=(int)(nNumMsg/LEP);
  150.          VisualizarListado(nOffset*LEP, (nOffset*LEP)+LEP);
  151.          SetScrollPos(hScrollBar,SB_VERT,nOffset*LEP,TRUE);
  152.          break;
  153.  
  154.     case WM_COMMAND:
  155.          switch (wParam)
  156.             {
  157.             case IDM_SALIR:
  158.                  DialogBox(hInst, "Salir", hwnd, MakeProcInstance (OpcionSalida ,hInst));
  159.                  break;
  160.  
  161.             case IDM_VER:
  162.                  rosa=(int)(WORD)SendMessage(hListBox,LB_GETCURSEL,0,0L);
  163.                  if(hElemLista[(nOffset*LEP)+rosa]==NULL)
  164.                     {
  165.                     GestErr(hwnd,6);
  166.                     break;
  167.                     }
  168.                  lplm=(bullist FAR *)GlobalLock( hElemLista[(nOffset*LEP)+rosa] );
  169.                  wsprintf(szCosaDos,"[Posicion Absoluta: %d]\nTipo/Estado: %c%c\nNumero: %ld\nTama±o: %ld\nFecha: %ld\nBbsf: %s\nBbsv: %s\nExped: %s\nDesti: %s\nBid: %s\nTitulo: %s\nUltimo cambio: %ld ",
  170.                                    (nOffset*LEP)+rosa,
  171.                                    lplm->type,
  172.                                    lplm->status,
  173.                                    lplm->numero,
  174.                                    lplm->taille,
  175.                                    lplm->date,
  176.                                    lplm->bbsf,
  177.                                    lplm->bbsv,
  178.                                    lplm->exped,
  179.                                    lplm->desti,
  180.                                    lplm->bid,
  181.                                    lplm->titre,
  182.                                    lplm->datech);
  183.  
  184.                  MessageBox(GetFocus(),szCosaDos,"┐ Que te parece el MSG ?",MB_OK);
  185.                  break;
  186.  
  187.             case IDM_BORRAR:
  188.                  rosa=(int)(WORD)SendMessage(hListBox,LB_GETCURSEL,0,0L);
  189.                  GlobalFree( hElemLista[(nOffset*LEP)+rosa] );
  190.                  hElemLista[(nOffset*LEP)+rosa]=NULL;
  191.                  VisualizarListado(nOffset*LEP, (nOffset*LEP)+LEP);
  192.                  // deleted!
  193.                  break;
  194.  
  195.             case IDM_EDITAR:
  196.                  //DialogBox(hInst, "EditarMsg", hwnd, MakeProcInstance (EditarMsg,hInst));
  197.                  break;
  198.  
  199.             case IDM_ACERCADE:
  200.                  MessageBox(GetFocus(),
  201.                             "Mini-Editor experimental del DIRMES.SYS para software de BBS de F6FBB (FBBBBS 5.14)\nEduardo EA3GHS@ea3rdl.eal.esp.eu",
  202.                             "Acerca de..",MB_OK|MB_ICONINFORMATION);
  203.                  break;
  204.             }
  205.     }
  206.     return DefWindowProc (hwnd, message, wParam, lParam) ;
  207. }
  208.  
  209. /* OpcionSalida
  210.  * ------------
  211.  *
  212.  */
  213. BOOL FAR PASCAL OpcionSalida(HWND hDlg,WORD message,WORD wParam,LONG lParam)
  214. {
  215.   switch(message)
  216.         {
  217.          case WM_DESTROY :
  218.               PostQuitMessage (0) ;
  219.               return 0 ;
  220.  
  221.          case WM_COMMAND:
  222.               switch (wParam)
  223.                      {
  224.                      case IDCANCEL:
  225.                           EndDialog(hDlg, TRUE);
  226.                           break;
  227.                      case IDOK:
  228.                           PasarListADisco(hDlg);
  229.                      case ID_SALIRSINGRABAR:
  230.                           PostQuitMessage (0) ;
  231.                           break;
  232.                      }
  233.               break;
  234.         }
  235.     return (FALSE);
  236. }
  237.  
  238.  
  239. void PasarListADisco( HWND hWnd)
  240.     {
  241.     HANDLE   hFichero;
  242.     OFSTRUCT OfStruct;
  243.     int      n,nErr;
  244.     char     szFichero[]="DIRMES.OK";
  245.     bullist  FAR *lplm;
  246.  
  247.     hFichero=OpenFile((LPSTR)szFichero,(LPOFSTRUCT)&OfStruct,OF_CREATE|OF_WRITE);
  248.     if (hFichero==-1) GestErr(hWnd,7);
  249.  
  250.     for(n=0;n!=MAXNUMMSG;n++)
  251.         {
  252.         if(hElemLista[n]==NULL) continue;
  253.         lplm=(bullist FAR *)GlobalLock( hElemLista[n] );
  254.         nErr= _lwrite(hFichero,(LPSTR)lplm , (WORD)sizeof( bullist ));
  255.         if (nErr==-1) GestErr(hWnd,8);
  256.         GlobalUnlock(hElemLista[n]);
  257.         GlobalFree  (hElemLista[n]);
  258.         }
  259.  
  260.     _lclose(hFichero);
  261.     }
  262.  
  263.  
  264. void PasaListAMemoria(HWND hWnd)
  265.     {
  266.     HANDLE   hFichero;
  267.     LPSTR    pTemp;
  268.     OFSTRUCT OfStruct;
  269.     int      n,nErr;
  270.     char     szFichero[]="DIRMES.SYS";
  271.  
  272.     hFichero=OpenFile((LPSTR)szFichero,(LPOFSTRUCT)&OfStruct,OF_READWRITE);
  273.     if (hFichero==-1) GestErr(hWnd,1);
  274.  
  275.     while(TRUE)
  276.         {
  277.         hElemLista[nNumMsg]=GlobalAlloc (GMEM_MOVEABLE | GMEM_ZEROINIT, sizeof (bullist) );
  278.         if(hElemLista[nNumMsg]==NULL) GestErr(hWnd,2);
  279.         pTemp=GlobalLock( hElemLista[nNumMsg] );
  280.  
  281.         nErr= _lread(hFichero, pTemp, (WORD)sizeof (bullist) );
  282.         if(nErr==-1) GestErr(hWnd,3);
  283.         if (nErr==0) break;
  284.         GlobalUnlock (hElemLista[nNumMsg]);
  285.         nNumMsg++;
  286.         }
  287.  
  288.     GlobalUnlock(hElemLista[nNumMsg]);
  289.     GlobalFree  (hElemLista[nNumMsg]);
  290.     _lclose(hFichero);
  291.     }
  292.  
  293.  
  294.  
  295. /* GestErr
  296.  * -------
  297.  * Gestiona los errores en la carga de archivos
  298.  */
  299. void GestErr (HWND hWnd, int errno)
  300. {
  301.     int nItem;
  302.     char szBuffer[200];
  303.  
  304.     LoadString(hInst,errno,szBuffer,200);
  305.     MessageBox(hWnd,szBuffer,NULL,MB_OK | MB_ICONHAND);
  306.  
  307. #ifndef DEBUG
  308.     PostQuitMessage(1);
  309. #endif
  310. }
  311.  
  312.  
  313. void VisualizarListado( int n,int m )
  314. {
  315. bullist FAR *lplm;
  316. char szString[200];
  317. int h;
  318. BOOL bError,bErrorDos;
  319.  
  320. // if(n>nNumMsg) GestErr(GetFocus(),5);
  321. SendMessage(hListBox,WM_SETREDRAW,FALSE,0L);
  322. SendMessage (hListBox,LB_RESETCONTENT,0,0L);
  323. for(n;n!=m;n++)
  324.     {
  325.     /* todas las fichas vacias, aparecen como NULL */
  326.     if(hElemLista[n]==NULL)
  327.         {
  328.         SendMessage(hListBox, LB_ADDSTRING, 0, (LONG)(LPSTR)"BORRADA");
  329.         continue;
  330.         }
  331.  
  332.     bError=TRUE;
  333.     bErrorDos=TRUE;
  334.  
  335.     lplm=(bullist FAR *)GlobalLock( hElemLista[n] );
  336.  
  337.     /* comprueba la consistencia de la ficha, si nota que hay algun error,
  338.      * aparece en la listbox como ficha "no consistente"
  339.      */
  340.  
  341.     for(h=0;tipe[h]!='\0';h++) if(lplm->type==tipe[h]) bError=FALSE;
  342.     for(h=0;status[h]!='\0';h++) if(lplm->status==status[h]) bErrorDos=FALSE;
  343.  
  344.     if (bError||bErrorDos)
  345.         {
  346.         SendMessage(hListBox, LB_ADDSTRING, 0, (LONG)(LPSTR)"FICHA NO CONSISTENTE (PUEDES BORRARME)");
  347.         GlobalUnlock( hElemLista[nNumMsg] );
  348.         continue;
  349.         }
  350.  
  351.     wsprintf(szString,"%ld [%c%c]  [%s -> %s@%s] %s",lplm->numero,lplm->type,  lplm->status,
  352.                   lplm->exped, lplm->desti, lplm->bbsv, lplm->titre);
  353.     SendMessage(hListBox, LB_ADDSTRING, 0, (LONG)(LPSTR) szString);
  354.     GlobalUnlock( hElemLista[nNumMsg] );
  355.     }
  356.  
  357. SendMessage(hListBox,WM_SETREDRAW,TRUE,0L);
  358.  
  359. }
  360.